package com.practice.designMode.coupon;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

/**
 * 将各类优惠券的校验规则抽象为标准化 JSON 格式，统一由规则校验引擎进行校验。
 * {
 *   "threshold": 100,       // 满减门槛（满减券专属）
 *   "discountRate": 0.9,    // 折扣率（折扣券专属）
 *   "minDeduction": 10,     // 最低抵扣额（折扣券限制）
 *   "validityPeriod": {
 *     "startTime": "2025-01-01",
 *     "endTime": "2025-01-31"
 *   },
 *   "applicable": {
 *     "productIds": [1001, 1002],  // 适用商品ID列表
 *     "storeIds": [501, 502],      // 适用门店ID列表
 *     "userTags": ["new_user"]     // 适用用户标签
 *   }
 * }
 *
 * 这种模式下，如果想要增加校验规则，比如增加优惠券要周末生效的规则，只需要增加JSON字段，对公共校验方法进行修改即可。
 * 如果要增加优惠券类型，则直接新增一个校验实现类，无需修改现有的代码。比如代金券，只需要增加一个VoucherStrategy类即可。
 */

public class CouponTest {
    public static void main(String[] args) {
        CouponStrategyFactory factory = new CouponStrategyFactory();
        RuleEngine engine = new RuleEngine(factory);

        LocalDate localDate = LocalDate.of(java.time.Year.now().getValue(), 7, 30);
        ZoneId zoneId = java.time.ZoneId.systemDefault();
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(zoneId);
        Date expireDate = java.util.Date.from(zonedDateTime.toInstant());

        // 创建订单
        Order order = new Order();
        order.setAmount(new BigDecimal("200.00"));
        order.setStoreId(101L);

        // 创建满减券
        UserCoupon fullReductionCoupon = new UserCoupon();
        fullReductionCoupon.setType(1);
        fullReductionCoupon.setExpireTime(expireDate);
        fullReductionCoupon.setRuleJson("{\"threshold\":100,\"applicableStores\":\"101,102\"}");

        // 校验满减券
        boolean isValid = engine.verifyCoupon(order, fullReductionCoupon);
        System.out.println("满减券校验结果: " + isValid);

        // 创建折扣券
        UserCoupon discountCoupon = new UserCoupon();
        discountCoupon.setType(2);
        discountCoupon.setExpireTime(expireDate);
        discountCoupon.setRuleJson("{\"discountRate\":0.9,\"minDiscount\":10,\"applicableStores\":\"101\"}");

        // 校验折扣券
        isValid = engine.verifyCoupon(order, discountCoupon);
        System.out.println("折扣券校验结果: " + isValid);
    }
}
